<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script>
// 父类 - 动物
function Animal(age) {
    this.age = age
    this.info = { name: 'foo' }
}

Animal.prototype.eat = function () {
    console.log('每一种动物都会吃东西')
}

// var a = new Animal(10)
//
// console.log(a)

// 子类 - 人
function Person(name, age, sex) {
    this.name = name
    this.sex = sex
    // 通过 call 调用将 Animal 内的 this 改为 new Person()，写入父类的基本属性
    Animal.call(this, age)
}

;(function () {
    function Super() {
    }

    // 将父类的原型复制一份
    Super.prototype = Animal.prototype

    // 先打印看看
    // console.log(Person.prototype);
    // console.log(new Super());

    // 将拥有父类的原型的实例对象赋给子类的原型对象
    Person.prototype = new Super()
})()

// 子类的原型属性得要在继承父类原型之后写，否则会被覆盖
Person.prototype.sayName = function () {
    console.log(this.name)
}

// 添加 constructor 属性，使它指向其构造函数
try {
    Object.defineProperty(Person.prototype, 'constructor', {value: Person})
} catch (err) {
    Person.prototype.constructor = Person
    console.warn(err.message);
}

var PersonA = new Person('张三', 18, '男')
var PersonB = new Person('小红', 20, '女')
console.log(PersonA);
console.log(PersonB);
</script>

</body>
</html>
